package com.shengwei.truck.driver.net;

import com.shengwei.truck.driver.bean.JsonCar;
import com.shengwei.truck.driver.bean.JsonCurUserInfoData;
import com.shengwei.truck.driver.bean.JsonDataCommon;
import com.shengwei.truck.driver.bean.JsonLoginData;
import com.shengwei.truck.driver.bean.JsonMsgListData;
import com.shengwei.truck.driver.bean.JsonPostFileData;
import com.shengwei.truck.driver.bean.JsonPoundsState;
import com.shengwei.truck.driver.bean.JsonStatisticsOneDayData;
import com.shengwei.truck.driver.bean.JsonStatisticsYmdData;
import com.shengwei.truck.driver.bean.JsonTrackData;
import com.shengwei.truck.driver.bean.MyConstant;
import com.shengwei.truck.driver.bean.task.JsonOrderDetailData;
import com.shengwei.truck.driver.bean.task.JsonOrderListData;
import com.shengwei.truck.driver.bean.task.JsonSearchUserData;
import com.shengwei.truck.driver.bean.task.JsonTaskDetailData;
import com.shengwei.truck.driver.bean.task.JsonTaskListData;
import com.shengwei.truck.driver.bean.task.OrderItem;
import com.shengwei.truck.driver.bean.task.TaskItem;

import java.util.ArrayList;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import rx.Observable;

/**
 *  所有服务器接口函数，当然 这里也可以分解成模块，例如为登录创建一个RetrofitLoginApiService，再为首页
 *  专门创建一个RetrofitHomeApiService
 */
public interface RetrofitApiService {
    /**
     * 调用登录接口
     *
     * @return 服务器返回的登录JSON转成的类对象
     */
    @POST("driverUser/login")
    Observable<JsonDataCommon<JsonLoginData>> login(
            @Body RequestBody userBody);

    /**
     * 获取验证码接口
     *
     * @return 服务器返回的获取验证码JSON转成的类对象
     */
    @POST("driverUser/sendCode")
    Observable<JsonDataCommon<String>> getSmsCode(
            @Body RequestBody userBody);

    /**
     * 调用注册接口
     *
     * @return 服务器返回的注册JSON转成的类对象
     */
    @POST("driverUser/register")
    Observable<JsonDataCommon<String>> regist(
            @Body RequestBody userBody);

    /**
     * 获取计划单列表（新订单列表）
     * @param pageNum： 分页页码
     * @param pageSize：每页行数
     * @return
     */
    @GET("transportTask/plansPage")
    Observable<JsonDataCommon<JsonOrderListData<OrderItem>>> getPlanOrders(
             @Query("page") int pageNum, @Query("size") int pageSize);


    /**
     * 得到订单详情
     * @param planId
     * @return
     */
    @GET("transportTask/plansInfo/{plansId}")
    Observable<JsonDataCommon<JsonOrderDetailData>> getOrderDetail(
            @Path("plansId") String planId);


    /**
     * 领取任务
     * @param planId: 新订单ID(又称计划单ID)
     * @return
     */
    @POST("transportTask/getTask/{plansId}")
    Observable<JsonDataCommon<String>> applayTask(
            @Path("plansId") String planId);
    /**
     * 调用获取任务列表接口
     *
     * @return 服务器返回的注册JSON转成的类对象
     */
    @GET("transportTask/page")
    Observable<JsonDataCommon<JsonTaskListData>> getTaskList(
            @Query("taskStatus") String taskStatus, @Query("page") int pageNum, @Query("size") int pageSize,@Query("isTrf") int isForward);



    /**
     * 修改密码（包括忘记密码）接口
     * @return 服务器返回的注册JSON转成的类对象
     */
    @PUT("driverUser/updatePW")
    Observable<JsonDataCommon<String>> resetPwd(
            @Body RequestBody userBody);


    /**
     * 修改密码（包括忘记密码）接口
     * @return 服务器返回的注册JSON转成的类对象
     */
    @PUT("driverUser/updatePW")
    Observable<JsonDataCommon<String>> resetPwd(
            @Body RequestBody userBody, @Header("Authorization") String authorization);


    /**
     * 获取任务详情
     * @param taskId：任务ID
     * @return
     */
    @GET("transportTask/{id}")
    Observable<JsonDataCommon<JsonTaskDetailData>> getTaskDetail(@Path("id") String taskId);

    /**
     * 获取当前用户信息
     * @return
     */
    @GET("driverUser/userInfo")
    Observable<JsonDataCommon<JsonCurUserInfoData>> getCurUserInfo();


    /**
     * 修改手机号
     * @return
     */
    @PUT("driverUser/updatePhone")
    Observable<JsonDataCommon<String>> updateMobile(@Body RequestBody userBody);

    /**
     * 上传文件
     * @param fileParams: 多部件上传内容：文件与文本
     * @return
     */
    @Multipart
    //@POST("http://192.168.100.19:18090/lh/file/uploadFile")
   //@POST("http://101.201.149.40:18090/lh/file/uploadFile")
   @POST(MyConstant.FILE_SERVER_DEBUG+"lh/file/uploadFile")
    Observable<JsonDataCommon<JsonPostFileData>> postFile(
            @Part MultipartBody.Part fileParams,@Query("isThumb") boolean isThumb
    );
    /**
     * 获取到位置轨迹
     * @param taskId
     * @param startTime
     * @param endTime
     * @return
     */
   // @GET("http://192.168.100.57:8070/lh/gis/getLocations")
    @GET(MyConstant.GIS_SERVER_DEBUG+"lh/gis/getLocations")
  //@GET("http://192.168.100.19:8070/lh/gis/getLocations")
    Observable<JsonDataCommon<JsonTrackData>> getTrack(@Query("taskId")String taskId, @Query("startTime") long startTime, @Query("endTime") long endTime);

    /**
     * 更改用户信息，包括用户头像、姓名等
     * @param updateUseInforBody:
     * @return
     */
    @PUT("driverUser/updateInfo")
    Observable<JsonDataCommon<String>> updateUserInfo(
            @Body RequestBody updateUseInforBody
    );

    /**
     * 接受任务
     * @param recvTaskBody 参数以JSON的格式被填充在http body里，JSON包含的参数有id，taskStatus
     * @return
     */
    @PUT("transportTask/updateStatus")
    Observable<JsonDataCommon<String>> recvTask(
            @Body RequestBody recvTaskBody
    );


    /**
     * 撤销任务, 扫码提货前都可以撤销
     * @param taskId
     * @return
     */
    @PUT("transportTask/endTask/{id}")
    Observable<JsonDataCommon<String>> cancelTask(
            @Path("id") String taskId
    );

    /**
     * 根据关键字查询车辆名称列表
     * @param keyWord
     * @return
     */
    @GET("vehicleMgr/vehTypeName")
    Observable<JsonDataCommon<ArrayList<JsonCar>>> searchCarName(
            @Query("keyWord") String keyWord);

    /**
     * 根据关键字查询车辆名称列表
     * @param carId: 车辆id
     * @return
     */
    @GET("vehicleMgr/vehTypeInfo/{id}")
    Observable<JsonDataCommon<JsonCar>> getCarDetail(
            @Path("id") String carId);


    /**
     * 绑定车辆信息
     * @param bindCarBody 参数以JSON的格式被填充在http body里
     * @return
     */
    @PUT("vehicleMgr/bindVehicle")
    Observable<JsonDataCommon<String>> bindCarInfo(
            @Body RequestBody bindCarBody);


    /**
     * 获取我的车辆信息
     * @return
     */
    @GET("vehicleMgr/vehicleInfo")
    Observable<JsonDataCommon<JsonCar>> getMyCarInfo();


    /**
     * 退出登录
     */
    @POST("driverUser/logout")
    Observable<JsonDataCommon<String>> Logout();

    /**
     * 提交磅单信息，包括榜单图片地址，榜单重量等信息
     */
    @POST("weighingList/subWeighingList")
    Observable<JsonDataCommon<String>> postPoundsList(@Body RequestBody poundsInfoBody);


    /**
     * 检查磅单状态  3出厂磅单已上传，0收货磅单已上传
     */
    @GET("weighingList/checkIsUpWeights")
    Observable<JsonDataCommon<JsonPoundsState>> checkPoundsState(@Query("taskId") String taskId);

    /**
     * 获取当前正在进行的任务
     * @return
     */
    @GET("transportTask/processing")
    Observable<JsonDataCommon<TaskItem>> getCurTask();

    /**
     * 根据手机号查找用户
     * @return
     */
    @GET("driverUser/getUserByphone")
    Observable<JsonDataCommon<JsonSearchUserData>> searchUserByMobile(@Query("phone") String mobile,@Query("taskId") String taskId);


    /**
     * 分享或转派,type = 1转派；2共享
     * @return
     */
    @PUT("transportTask/trfOrShare")
    Observable<JsonDataCommon<String>> shareForward(@Body RequestBody share);

    /**
     *
     * @param share
     * @return
     */
    @PUT("transportTask/trfOrShareVerify")
    Observable<JsonDataCommon<String>> shareForwardVerify(@Body RequestBody share);

    /**
     * 未读消息数
     * @return
     */
    @GET("msg/unReadRedDot")
    Observable<JsonDataCommon<String>> getUnReadNum();


    /**
     * 已读接口
     * @return
     */
    @PUT("msg")
    Observable<JsonDataCommon<String>> postHasRead(@Body RequestBody hasReadBody);


    /**
     * 消息列表
     * @return
     */
    @GET("msg/page")
    Observable<JsonDataCommon<JsonMsgListData>> getMsgList(
            @Query("page") int pageNum, @Query("size") int pageSize,@Query("type") String msgType);


    /**
     * 获取某一天的统计数据
     * @date: 某一天的日期，如2021-03-01
     */
    @GET("/driverStats/simStats")
    Observable<JsonDataCommon<JsonStatisticsOneDayData>> getStatisticsOneDay(
            @Query("date") String date);


    /**
     * 统计，按周，月，年，分别返回7条数据，31条数据（如果当月有31天），12条数据
     *
     *  @param type ：       0代表周;  1代表月;  2代表年
     *  @param year ：       type为1或2时传递
     *  @param month :      type为1时传递
     *  @param startTime : type为0时，传递周的开始时间
     *  @param endTime :    type为0时，传递周的结束时间
     */
    @GET("/driverStats/chartStats")
    Observable<JsonDataCommon<JsonStatisticsYmdData>> getStatisticsYmdData(
            @Query("type") int type,@Query("year") int year,@Query("month") int month,
            @Query("startTime") long startTime,
            @Query("endTime") long endTime);

}
